import pandas as pd


def load_csv_to_df(file_path):
    """
    从CSV文件加载数据并转换为DataFrame

    参数:
    file_path (str): CSV文件的路径。

    返回:
    pd.DataFrame: 包含CSV文件数据的DataFrame。
    """
    # 使用pandas读取CSV文件
    df = pd.read_csv(file_path)
    return df


def identify_target_variable(df, data_source_info, modeling_goal):
    """
    根据提供的数据源信息和建模目标，识别目标变量

    参数:
    df (pd.DataFrame): 包含数据的DataFrame。
    data_source_info (str): 数据来源的描述。
    modeling_goal (str): 建模目标的描述。

    返回:
    str: 目标变量的名称。
    """
    # 打印数据列信息
    print("数据列信息：")
    for column in df.columns:
        print(f"- {column}: {df[column].dtype} - {df[column].head()}")

    # 根据提供的信息识别目标变量
    target_variable = None

    # 示例：根据提供的信息确定目标变量
    if "预测未来一个月的产品销售额" in modeling_goal:
        target_variable = '销售额'
    elif "预测未来一个月的销量" in modeling_goal:
        target_variable = '销量'
    else:
        print("无法确定目标变量，请提供更多详细信息。")

    return target_variable

# 事例1
fiel_path_join = "hj/data/data.csv"

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split

def load_csv_to_df(file_path):
    """
    从CSV文件加载数据并转换为DataFrame

    参数:
    file_path (str): CSV文件的路径。

    返回:
    pd.DataFrame: 包含CSV文件数据的DataFrame。
    """
    df = pd.read_csv(file_path)
    return df

def preprocess_data(df, target_variable):
    """
    预处理数据，包括处理缺失值、异常值等

    参数:
    df (pd.DataFrame): 包含数据的DataFrame。
    target_variable (str): 目标变量的名称。

    返回:
    pd.DataFrame: 预处理后的DataFrame。
    """
    # 处理缺失值
    df.fillna(df.mean(), inplace=True)  # 用均值填充数值型特征的缺失值
    df.fillna(df.mode().iloc[0], inplace=True)  # 用众数填充类别型特征的缺失值

    # 处理异常值（例如，使用Z-score方法）
    z_scores = np.abs((df.select_dtypes(include=[np.number]) - df.select_dtypes(include=[np.number]).mean()) / df.select_dtypes(include=[np.number]).std())
    df = df[(z_scores < 3).all(axis=1)]

    return df

def feature_engineering(df, target_variable):
    """
    特征工程，包括特征选择、特征转换和特征创建

    参数:
    df (pd.DataFrame): 包含数据的DataFrame。
    target_variable (str): 目标变量的名称。

    返回:
    pd.DataFrame: 特征工程后的DataFrame。
    """
    # 分离特征和目标变量
    X = df.drop(columns=[target_variable])
    y = df[target_variable]

    # 定义数值型和类别型特征
    numeric_features = X.select_dtypes(include=[np.number]).columns.tolist()
    categorical_features = X.select_dtypes(include=[object]).columns.tolist()

    # 创建数值型特征的预处理管道
    numeric_transformer = Pipeline(steps=[
        ('imputer', SimpleImputer(strategy='mean')),  # 用均值填充缺失值
        ('scaler', StandardScaler())  # 标准化
    ])

    # 创建类别型特征的预处理管道
    categorical_transformer = Pipeline(steps=[
        ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),  # 用常量填充缺失值
        ('onehot', OneHotEncoder(handle_unknown='ignore'))  # one-hot编码
    ])

    # 创建列转换器
    preprocessor = ColumnTransformer(
        transformers=[
            ('num', numeric_transformer, numeric_features),
            ('cat', categorical_transformer, categorical_features)
        ])

    # 创建完整的预处理管道
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor)
    ])

    # 应用预处理管道
    X_processed = pipeline.fit_transform(X)

    # 将处理后的特征转换回DataFrame
    numeric_columns = numeric_features
    categorical_columns = pipeline.named_steps['preprocessor'].named_transformers_['cat'].named_steps['onehot'].get_feature_names_out(categorical_features)
    columns = list(numeric_columns) + list(categorical_columns)
    X_processed_df = pd.DataFrame(X_processed, columns=columns)

    return X_processed_df,

# 示例使用
file_path = 'path/to/your/csv/file.csv'
data_source_info = "数据来源于销售记录，包含产品销售的各种指标。"
modeling_goal = "预测未来一个月的产品销售额。"

# 加载数据
df = load_csv_to_df(file_path)

# 识别目标变量
target_variable = identify_target_variable(df, data_source_info, modeling_goal)
print(f"目标变量是：{target_variable}")
